/*****************************************************************************
*                     Organizacion de Datos - 75.06                          *
*                         Catedra Lic. Servetto                              *
*            Facultad de Ingenieria - Universidad de Buenos Aires            *
******************************************************************************/

#include "ParseadorComandos.h"
#include "AdministradorDeOperaciones.h"
#include "AdministradorMetadata.h"

#include <list>
#include <string>
#include <fstream>
#include <map>

namespace CapaConsulta 
{

	Operacion* ParseadorComandos::ParsearBorrado(list<string>* operacion) {
		
		Borrado* operacionBorrado = new Borrado();
		map<string, AdministradorMetadata*> administradores = *(new map<string, AdministradorMetadata*>());
		
		/***************************************/
		/* DELETE                              */
		/***************************************/
		
		string deleteSupuesto = operacion->front();
		if (deleteSupuesto != "DELETE")
		{
			cerr << "El borrado en una clase espera el comando DELETE, se encontro " << deleteSupuesto << "." << endl;
			throw new exception();
		}
		ParseadorComandos::SacarConComprobacion(operacion, "DELETE");
		
		/***************************************/
		/* FROM                                */
		/***************************************/
		
		string fromSupuesto = operacion->front();
		if (fromSupuesto != "FROM")
		{
			cerr << "El borrado en una clase espera el comando FROM despues de DELETE, se encontro " << fromSupuesto << "." << endl;
			throw new exception();
		}
		ParseadorComandos::SacarConComprobacion(operacion, "DELETE");
		
		/***************************************/
		/* Clase                               */
		/***************************************/
		
		string claseSupuesto = operacion->front();
		AdministradorMetadata* administrador = new AdministradorMetadata(claseSupuesto);
		if (!administrador->ExisteClase())
		{
			cerr << "No se puede encontrar la clase '" << claseSupuesto << "' en el repositorio." << endl;
			throw new exception();
		}
		ParseadorComandos::SacarConComprobacion(operacion, "DELETE");
		
		administradores.insert( *(new pair<string, AdministradorMetadata*>(claseSupuesto, administrador)) );
		
		operacionBorrado->ClaseOperacion = administrador->ClaseMetadata;
		
		/***************************************/
		/* WHERE                               */
		/***************************************/
		
		CondicionCompuesta* condicionCompuesta;
		condicionCompuesta = ParseadorComandos::ParsearWhere("DELETE", operacion, administradores, false);
		operacionBorrado->Condiciones = condicionCompuesta;
		
		if (!operacion->empty())
		{
			cerr << "Se econtraron " << operacion->size() << " cadena(s) no esperadas al final de la operacion DELETE" << endl;
			throw new exception();
		}
		
		return operacionBorrado;
	};
	
}
